/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Serveur;

import exception.ChoiceException;
import exception.CommunicationResponseException;
import exception.ReadingObjectException;
import librairie.StructureProtocole;

/**
 *
 * @author Florian Minin
 */
public class ApplicationServeur implements Runnable {

    private InterfaceProtocoleServeur ps;

    public ApplicationServeur(InterfaceProtocoleServeur _ps) {
        ps = _ps;
        new Thread(this).start();
    }

    @Override
    public void run() {
        try {
            ps.recevoirMessage();

            double montant;
            int nbAnnees;
            double tauxInteret;
            double annuite;

            String choix = ps.choixFonction();
            if(choix.equals("annee")) {

                    montant = (Double) ps.getParametre(StructureProtocole.MONTANT);
                    if (!controleMontant(montant)) {
                        ps.envoyerErreurMontant();
                    }

                    nbAnnees = (Integer) ps.getParametre(StructureProtocole.NB_ANNEES);
                    if (!controleNbAnnees(nbAnnees)) {
                        ps.envoyerErreurNbAn();
                    }

                    tauxInteret = (Double) ps.getParametre(StructureProtocole.TAUX_INTERET);
                    if (!controleTauxInterets(tauxInteret)) {
                        ps.envoyerErreurTxInteret();
                    }

                    annuite = calculAnnuite(montant, nbAnnees, tauxInteret);
                    ps.envoyerResultat(annuite);
            }
            if(choix.equals("annuite")) {
                    annuite = (Double) ps.getParametre(StructureProtocole.ANNUITE);
                    if (!controleAnnuite(annuite)) {
                        ps.envoyerErreurAnnuites();
                    }

                    tauxInteret = (Double) ps.getParametre(StructureProtocole.TAUX_INTERET);
                    if (!controleTauxInterets(tauxInteret)) {
                        ps.envoyerErreurTxInteret();
                    }

                    montant = (Double) ps.getParametre(StructureProtocole.MONTANT);
                    if (!controleMontant(montant)) {
                        ps.envoyerErreurMontant();
                    }

                    double nombreAnnees = calculNbAnnees(annuite, tauxInteret, montant);
                    ps.envoyerResultat(nombreAnnees);
            }
        } catch (ChoiceException ce) {
            System.err.println("Erreur lors de l'interpretation du calcul.");
        } catch (CommunicationResponseException ce) {
            System.err.println("Erreur niveau serveur");
        } catch (ReadingObjectException cnfe) {
            cnfe.printStackTrace();
        }
    }

    private double calculAnnuite(double montant, int nbAnnees, double txInteret) {
        txInteret = txInteret / 100;
        double puissance = Math.pow(1 + txInteret, nbAnnees);
        return montant * txInteret * (puissance / (puissance - 1));
    }

    private double calculNbAnnees(double annuite, double txInteret, double montant) {
        txInteret = txInteret / 100;
        double numerateur = Math.log(1 - ((txInteret * montant) / annuite));
        double denominateur = Math.log(1 + txInteret);
        return -(numerateur / denominateur);
    }

    private boolean controleMontant(double montant) {
        return (montant > 0);
    }

    private boolean controleTauxInterets(double txInterets) {
        return (txInterets > 0);
    }

    private boolean controleNbAnnees(int nbAnnees) {
        return (nbAnnees > 0);
    }

    private boolean controleAnnuite(double annuite) {
        return (annuite > 0);
    }
}
